/**
 * 批改功能工具方法
 */

/**
 * 根据坐标信息获取字符的中心点
 * @param {Object} wz 字符位置信息 {t, l, w, h}
 * @returns {Object} 中心点坐标 {x, y}
 */
export function getCharCenter(wz) {
	if (!wz || typeof wz !== 'object') {
		console.error('getCharCenter: wz参数无效', wz)
		return {
			x: 0,
			y: 0
		}
	}

	if (typeof wz.l !== 'number' || typeof wz.t !== 'number' ||
		typeof wz.w !== 'number' || typeof wz.h !== 'number') {
		console.error('getCharCenter: wz属性不完整', wz)
		return {
			x: 0,
			y: 0
		}
	}

	return {
		x: wz.l + wz.w / 2,
		y: wz.t + wz.h / 2
	}
}

/**
 * 检测点击位置是否在字符范围内
 * @param {Number} clickX 点击的X坐标
 * @param {Number} clickY 点击的Y坐标
 * @param {Object} wz 字符位置信息 {t, l, w, h}
 * @param {Number} padding 扩展的点击范围
 * @returns {Boolean} 是否在范围内
 */
export function isClickInChar(clickX, clickY, wz, padding = 20) {
	return clickX >= wz.l - padding &&
		clickX <= wz.l + wz.w + padding &&
		clickY >= wz.t - padding &&
		clickY <= wz.t + wz.h + padding
}

/**
 * 根据原图坐标转换为canvas坐标
 * @param {Number} originalX 原图X坐标
 * @param {Number} originalY 原图Y坐标
 * @param {Number} originalWidth 原图宽度
 * @param {Number} originalHeight 原图高度
 * @param {Number} canvasWidth canvas宽度
 * @param {Number} canvasHeight canvas高度
 * @returns {Object} canvas坐标 {x, y}
 */
export function convertToCanvasCoord(originalX, originalY, originalWidth, originalHeight, canvasWidth, canvasHeight) {
	return {
		x: (originalX / originalWidth) * canvasWidth,
		y: (originalY / originalHeight) * canvasHeight
	}
}

/**
 * 根据canvas坐标转换为原图坐标
 * @param {Number} canvasX canvas X坐标
 * @param {Number} canvasY canvas Y坐标
 * @param {Number} originalWidth 原图宽度
 * @param {Number} originalHeight 原图高度
 * @param {Number} canvasWidth canvas宽度
 * @param {Number} canvasHeight canvas高度
 * @returns {Object} 原图坐标 {x, y}
 */
export function convertToOriginalCoord(canvasX, canvasY, originalWidth, originalHeight, canvasWidth, canvasHeight) {
	return {
		x: (canvasX / canvasWidth) * originalWidth,
		y: (canvasY / canvasHeight) * originalHeight
	}
}

/**
 * 获取错别字列表
 * @param {Array} list 批改结果列表
 * @returns {Array} 错别字列表
 */
export function getErrorChars(list) {
	const errorChars = []

	if (!Array.isArray(list)) {
		console.error('getErrorChars: list不是数组', list)
		return errorChars
	}

	list.forEach((item, textIndex) => {
		if (!item || !Array.isArray(item.chars)) {
			console.error(`getErrorChars: item[${textIndex}]数据格式错误`, item)
			return
		}

		item.chars.forEach((char, charIndex) => {
			if (!char || typeof char !== 'object') {
				console.error(`getErrorChars: char[${textIndex}][${charIndex}]数据格式错误`, char)
				return
			}

			if (char.type === 0) { // type=0表示错误
				if (!char.wz) {
					console.warn(`错别字缺少位置信息，跳过: ${char.zi} -> ${char.origin}`)
					return
				}

				errorChars.push({
					...char,
					textIndex,
					charIndex,
					center: getCharCenter(char.wz)
				})
			}
		})
	})

	return errorChars
}

/**
 * 获取漏写字列表
 * @param {Array} list 批改结果列表
 * @returns {Array} 漏写字列表
 */
export function getMissingChars(list) {
	const missingChars = []

	if (!Array.isArray(list)) {
		console.error('getMissingChars: list不是数组', list)
		return missingChars
	}

	list.forEach((item, textIndex) => {
		if (!item || !Array.isArray(item.chars)) {
			console.error(`getMissingChars: item[${textIndex}]数据格式错误`, item)
			return
		}

		item.chars.forEach((char, charIndex) => {
			if (!char || typeof char !== 'object') {
				console.error(`getMissingChars: char[${textIndex}][${charIndex}]数据格式错误`, char)
				return
			}

			if (char.type === -1) { // type=-1表示漏写
				// 漏写的字符可能没有wz属性（无法确定位置），直接跳过
				if (!char.wz) {
					return
				}

				missingChars.push({
					...char,
					textIndex,
					charIndex,
					center: getCharCenter(char.wz)
				})
			}
		})
	})

	return missingChars
}

/**
 * 根据图片尺寸计算合适的圆圈大小和线条宽度
 * @param {Number} imageWidth 图片宽度
 * @param {Number} imageHeight 图片高度
 * @returns {Object} 样式配置 {circleSize, lineWidth, fontSize}
 */
export function calculateStyles(imageWidth, imageHeight) {
	const maxSize = Math.max(imageWidth, imageHeight)

	if (maxSize > 2000) {
		return {
			circleSize: 35,
			lineWidth: 4,
			fontSize: 80
		}
	} else if (maxSize > 1000) {
		return {
			circleSize: 25,
			lineWidth: 3,
			fontSize: 50
		}
	} else {
		return {
			circleSize: 18,
			lineWidth: 2,
			fontSize: 30
		}
	}
}